package com.xiaoy.dao;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springside.modules.orm.Page;
import org.springside.modules.orm.PropertyFilter;
import org.springside.modules.orm.hibernate.HibernateDao;

/**
 * 扩展springSide的HibernateDao，增加一些自己的通用方法
 * 
 * 
 * @param <T>
 *            泛型类型
 * @param <PK>
 *            主键类型
 */
public class HibernateDaoWrapper<T, PK extends Serializable> extends
		HibernateDao<T, PK> {

	protected Logger logger = LoggerFactory.getLogger(getClass());

	public HibernateDaoWrapper() {
		super();
	}

	/**
	 * 用于导出数据时，根据当时的查询条件以及排序状态导出
	 * 
	 * @param filters
	 *            查询条件
	 * @param orderBy
	 *            根据哪个字段排序
	 * @param order
	 *            升序还是降序
	 * @return 查询结果
	 */
//	public List<T> find(List<PropertyFilter> filters, String orderBy,
//			String order) {
//		Criteria c = getCriteria(filters, orderBy, order);
//		return find(c);
//	}

	/**
	 * 根据条件 生成 Criteria
	 * 
	 * @param filters
	 *            查询条件
	 * @param orderBy
	 *            根据哪个字段排序
	 * @param order
	 *            升序还是降序
	 * @return Criteria
	 */
//	public Criteria getCriteria(List<PropertyFilter> filters, String orderBy,String order) {
//		Criterion[] criterions = buildPropertyFilterCriterions(filters);
//		Criteria c = createCriteria(criterions);
//		if (orderBy != null) {
//			if ("desc".equals(order)) {
//				c.addOrder(Order.desc(orderBy));
//			} else {
//				c.addOrder(Order.asc(orderBy));
//			}
//		}
//		return c;
//	}

	/**
	 * 用于导出数据时，根据当时的查询条件以及排序状态导出
	 * 
	 * @param criteria
	 *            查询条件
	 * @param orderBy
	 *            根据哪个字段排序
	 * @param order
	 *            升序还是降序
	 * @return 查询结果
	 */
	public List<T> find(Criteria c) {
		return c.list();
	}

//	public Page findPage(Page page, List<PropertyFilter> filter,
//			Criterion... criterions) {
//		Criterion[] cris = buildPropertyFilterCriterions(filter);
//		int length = cris.length + criterions.length;
//		Criterion[] cs = new Criterion[length];
//		System.arraycopy(cris, 0, cs, 0, cris.length);
//		System.arraycopy(criterions, 0, cs, cris.length, criterions.length);
//		return findPage(page, cs);
//	}

//	public Page findPage(Page pageList, Criteria c) {
//		if (pageList.isAutoCount()) {
//			int totalCount = countCriteriaResult(c);
//			pageList.setTotalCount(totalCount);
//		}
//		setPageParameter(c, pageList);
//		List result = c.list();
//		pageList.setResult(result);
//		return pageList;
//	}
}
